package com.opcode.nebulamobil.information;

import android.util.Log;

import com.opcode.nebulamobil.information.dataforms.costadataforms.ConnectionStatus;
import com.opcode.nebulamobil.base.interfaces.AudioConnectionListener;
import com.opcode.nebulamobil.base.interfaces.ConnectionListener;
import com.opcode.nebulamobil.base.interfaces.OnFoodDetailSelectListener;
import com.opcode.nebulamobil.base.interfaces.PushTalkDataListener;
import com.opcode.nebulamobil.base.interfaces.RequestListener;
import com.opcode.nebulamobil.base.interfaces.ResponseListener;
import com.opcode.nebulamobil.base.interfaces.SelectedFoodListener;
import com.opcode.nebulamobil.base.interfaces.ServerAlertListener;
import com.opcode.nebulamobil.base.interfaces.TryConnectionCommandListener;

public class ApplicationInfo implements ConnectionListener{

	/*
	 * Bu listener connectionService taraf�ndan dinlenir. 
	 * Uygulaman�n herhangi bir yerinden sunucuya bir�ey g�nderilmek istendi�inde RequestListener'�n ilgili metoduna requesy objesini vermek yeterlidir.
	 * Bu request objesini alan connectionService ilgili requet'i sunucuya iletir.
	 */
	private static volatile RequestListener requestListener;
	
	/*
	 * STS Uygulamasından bas-konuş datası geldiği zaman bunu sunucuya iletilmek üzere PushTalkService'w ileten arabirimdir.
	 */
	private static volatile PushTalkDataListener pushTalkDataListener;
	
	
	/*
	 * Sunucudan gelecek cevaplar� almak isteyen s�n�flar taraf�ndan uygulanan bir arabirimdir.
	 * ConnectionService taraf�ndan elde edilen response objesi responseListener'�n ilgili metoduna g�nderilir.
	 * ResponseListener arabirimini uygulayan s�n�f taraf�ndan b�t�n response'lar al�n�r. Ancak burada yer alan bi if else blo�u i�erisinde sadece kendisiyle alakal� response'lar �zerinde i�lem yapar.
	 */
	private static volatile ResponseListener responseListener;
	
	/*
	 * FragmentActivityBase taraf�ndan uygulanan bir arabirimdir. 
	 * Bu arabiirim, baz� response'lar� alarm olarak elde edilmesini istendi�i durumlar i�in kullan�lmaktad�r.
	 * �rne�in sunucuya herhangi bir request yap�lmadan gelen cevaplar (Aktif masa listesinin g�ncellenmesi vb.) bu listener taraf�ndan elde edilir.
	 * Ayr�ca sunucudan alarm olarak g�nderilebilecek durumlar da bu arabirim taraf�ndan ele al�n�r.
	 */
	private static volatile ServerAlertListener alertListener;
	
	/*
	 * Ba�lant� durumuyla ilgili de�i�ikliklerden haberdar olmak isteyen s�n�flar taraf�ndan uygulanan bir arabirimdir.
	 * Bu arabirim sayesinde sunucyla ba�lant�n�n kuruldu�u, ba�lant�n�n koptu�u, veri al�nmas�nda problem ya�and��� durumlar tespit edilir.
	 * B�ylece kullan�c�dan gerekli aksiyonu almas� istenir.
	 */
	private static volatile ConnectionListener connectionListener;
	
	/*
	 * Sipari� ekleme ekranlar�nda bir diyalog �zerinden se�imi yap�lan yemekler fragment'a bildirilirken bu yap� kulla �lm��t�r.
	 * Se�ili yemeklerin bulund�u liste bu arabirimin ilgili metoduna bildirilir.
	 * B�ylece fragment se�ili yemek listesinden haberdar olur.
	 */
	private static volatile SelectedFoodListener selectedFoodListener;
	
	/*
	 * Bu arabirim de connectionService taraf�ndan uygulan�r.
	 * Ba�lant�da herhangi bir problem oldu�u durumlarda tekrar dene butonuna bas�ld���nda bu arabirimin ilgili metodu �al��t�r�l�r.
	 * B�ylece ba�lant� talebi tekrar sunucuya g�nderilir.
	 */
	private static volatile TryConnectionCommandListener tryConnectionCommandListener;
	
	/*
	 * Yemkelere ait detay bilgilerinin (adet bilgisi vb.) yemek listesi diyaloguna bildirildi�i arabirimdir.
	 * Uygulamada genel olarak diyaloglar ile onu a�an birimler aras�ndaki haberle�me arabirimler kullan�larak yap�lm��t�r.
	 * Bu durumun bir di�er �rne�i olarak SelectedFoodListener'� g�sterebiliriz.
	 */
	private static volatile OnFoodDetailSelectListener onFoodDetailSelected;
	
	private static volatile AudioConnectionListener audioConnectionListener;
	/*
	 * �al��an uygulaman�n tablet mi telefon mu oldu�u bilgisini tutan de�i�kendir.
	 */
	private static volatile boolean tablet;
	
	private static volatile boolean changedToLoginFragment;




	
	public static RequestListener getRequestListener() {
		return requestListener;
	}

	public static void setRequestListener(RequestListener requestListener) {
		ApplicationInfo.requestListener = requestListener;
	}

	public static PushTalkDataListener getPushTalkDataListener() {
		return pushTalkDataListener;
	}

	public static void setPushTalkDataListener(
			PushTalkDataListener pushTalkDataListener) {
		ApplicationInfo.pushTalkDataListener = pushTalkDataListener;
	}

	public static ResponseListener getResponseListener() {
		return responseListener;
	}

	public static void setResponseListener(ResponseListener responseListener) {
		ApplicationInfo.responseListener = responseListener;
	}

	public static ServerAlertListener getAlertListener() {
		return alertListener;
	}

	public static void setAlertListener(ServerAlertListener alertListener) {
		ApplicationInfo.alertListener = alertListener;
	}

	public static ConnectionListener getConnectionListener() {
		return connectionListener;
	}

	public static void setConnectionListener(ConnectionListener connectionListener) {
		ApplicationInfo.connectionListener = connectionListener;
	}

	public static SelectedFoodListener getSelectedFoodListener() {
		return selectedFoodListener;
	}

	public static void setSelectedFoodListener(
			SelectedFoodListener selectedFoodListener) {
		ApplicationInfo.selectedFoodListener = selectedFoodListener;
	}

	public static TryConnectionCommandListener getTryConnectionCommandListener() {
		return tryConnectionCommandListener;
	}

	public static void setTryConnectionCommandListener(
			TryConnectionCommandListener tryConnectionCommandListener) {
		ApplicationInfo.tryConnectionCommandListener = tryConnectionCommandListener;
	}


	@Override
	public void connectionStatusChanged(ConnectionStatus status) {
		Log.i("ApplicationInfo", "Bağlantı durumunda değişiklik meydana geldi.");

	}
	
	/**
	 * 
	 * @return
	 */
	public static OnFoodDetailSelectListener getOnFoodDetailSelectedListener() {
		return onFoodDetailSelected;
	}

	
	/**
	 * 
	 * @param onFoodDetailSelected
	 */
	public static void setOnFoodDetailSelectedListener(OnFoodDetailSelectListener onFoodDetailSelected) {
		ApplicationInfo.onFoodDetailSelected = onFoodDetailSelected;
	}

	public static boolean isTablet() {
		return tablet;
	}

	public static void setTablet(boolean tablet) {
		ApplicationInfo.tablet = tablet;
	}

	public static boolean isChangedToLoginFragment() {
		return changedToLoginFragment;
	}

	public static void setChangedToLoginFragment(boolean changedToLoginFragment) {
		ApplicationInfo.changedToLoginFragment = changedToLoginFragment;
	}

	public static AudioConnectionListener getAudioConnectionListener() {
		return audioConnectionListener;
	}

	public static void setAudioConnectionListener(
			AudioConnectionListener audioConnectionListener) {
		ApplicationInfo.audioConnectionListener = audioConnectionListener;
	}
}
